開始倒數了,耶耶耶。
今天我們來繼續,今天要講 class 跟 struct 。
他們有很多共通點
class 跟 struct 相比之下有多以下幾個功能
struct 跟 class 有相似的定義方式。
struct SomeStructure {
}
class SomeClass {
}
這邊我們就定義一下我們的 struct 跟 class
struct SquareForStruct {
var length = 0
var width = 0
var height = 0
}
class SquareForClass {
var square = SquareForStruct()
var name: String = ""
}
let squareForStruct = SquareForStruct()
let squareForClass = SquarForClass()
基本上一樣,只要在後面 + 上 () 就好。
print("長度是多少: \(squreForStruct.length)")
// 長度為多少: 0
也可以訪問子屬性
print("寬度是多少: \(squareForClass.square.width)")
// 寬度是多少 0
也可以改變裡面的一個變量
squareForClass.name = "方塊"
print("名稱是:\(squareForClass.name)")
// 名稱是: 方塊
什麼是值類型,其實前面我們就介紹到很多相同類型的東西了,例如 整數(Int)、浮點數(float)、布林值(Bool)、字符串(String)、數組(Array)⋯⋯等。
然而值類型的實例就是你創建任何的 Struct 跟 enum 的實例或者是以他們做為 Type 在程式碼中他們傳遞時都是被複製的。
let green = Color(red: 0, green: 255, blue: 0, black: false)
var green2 = green
然後你可以修改 green2 裡面的數值,而不會影響到 green 。
green2.green = 100
print(green2.green)
// 100
print(green.green)
// 255
大概就是這種感覺
跟值類型不同,引用類型就是被賦予的變量跟常量設定了,如果傳遞了不是複製一份,而是使用已有的實例裡面的變量跟常量。
我們看官方的例子
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
我們已新增了一個新的常量 tenEighty,那我們再新增一個常量引用 tenEighty 在變動裡面的變量。
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print(\tenEighty.frameRate)
// 30.0
因為是引用類型所以都會改到 VideoMode 實例之後裡面定義的數值。
大概就像這樣,都是同一個(X)但是逐漸母湯。
好今天我們就到這裡了,讓我們明天繼續。